from django.db import models
from meiduo_mall.utils.models import BaseModel
# Create your models here.

class OrderInfo(BaseModel):
    """订单信息"""
    PAY_METHODS_ENUM = {
        "CASH": 1,
        "ALIPAY": 2
    }
    # 自定义的类属性，被choices约束条件使用的
    PAY_METHOD_CHOICES = (
        # (整数值, "描述性字符串")
        (1, "货到付款"),
        (2, "支付宝"),
    )
    ORDER_STATUS_ENUM = {
        "UNPAID": 1,
        "UNSEND": 2,
        "UNRECEIVED": 3,
        "UNCOMMENT": 4,
        "FINISHED": 5
    }
    ORDER_STATUS_CHOICES = (
        (1, "待支付"),
        (2, "待发货"),
        (3, "待收货"),
        (4, "待评价"),
        (5, "已完成"),
        (6, "已取消"),
    )
    #  primary_key=True --> 自己指定当前字段为主键
    #  (1)、唯一性；(2)、自己创造主键的方式：时间戳+用户id
    order_id = models.CharField(max_length=64, primary_key=True, verbose_name="订单号")

    user = models.ForeignKey('users.User', related_name='orders', on_delete=models.PROTECT, verbose_name="下单用户")
    address = models.ForeignKey('users.Address', on_delete=models.PROTECT, verbose_name="收货地址")

    total_count = models.IntegerField(default=1, verbose_name="商品总数")
    total_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品总金额")
    freight = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="运费")
    # pay_method类型是一个整数，我们以不同的整数表示不同的支付方式
    # choices=PAY_METHOD_CHOICES
    # pay_method = 1 ---> 魔鬼数字
    # pay_method = OrderInfo.PAY_METHODS_ENUM['CASH']
    pay_method = models.SmallIntegerField(choices=PAY_METHOD_CHOICES, default=1, verbose_name="支付方式")
    status = models.SmallIntegerField(choices=ORDER_STATUS_CHOICES, default=1, verbose_name="订单状态")

    class Meta:
        db_table = "tb_order_info"
        verbose_name = '订单基本信息'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.order_id


class OrderGoods(BaseModel):
    """订单商品"""
    SCORE_CHOICES = (
        (0, '0分'),
        (1, '20分'),
        (2, '40分'),
        (3, '60分'),
        (4, '80分'),
        (5, '100分'),
    )

    # related_name='skus' --> 在主表中(OrderInfo)设置隐藏字段skus，记录从表(OrderGoods)多条对象数据
    order = models.ForeignKey(OrderInfo, related_name='skus', on_delete=models.CASCADE, verbose_name="订单")
    # 关联的主表SKU单一对象
    sku = models.ForeignKey('goods.SKU', on_delete=models.PROTECT, verbose_name="订单商品")
    count = models.IntegerField(default=1, verbose_name="数量")
    # 记录当前用户购买此商品的实际价格；
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="单价")
    comment = models.TextField(default="", verbose_name="评价信息")
    score = models.SmallIntegerField(choices=SCORE_CHOICES, default=5, verbose_name='满意度评分')
    is_anonymous = models.BooleanField(default=False, verbose_name='是否匿名评价')
    is_commented = models.BooleanField(default=False, verbose_name='是否评价了')

    class Meta:
        db_table = "tb_order_goods"
        verbose_name = '订单商品'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.sku.name